package com.starkuz.controllers.sites;

import com.starkuz.dao.ifaces.sites.LaunSiteDao;
import com.starkuz.dao.ifaces.visits.VisitLaunDao;
import com.starkuz.dto.FormFieldsDto;
import com.starkuz.dto.SetPeriodDto;
import com.starkuz.model.User;
import com.starkuz.model.sites.LaunSite;
import com.starkuz.model.sites.LeadSite;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.TreeSet;


@Controller
public class LaunSitesController {

    @Autowired
    private LaunSiteDao launSiteDao;

    public void setLaunSiteDao(LaunSiteDao launSiteDao) {
        this.launSiteDao = launSiteDao;
    }

    @Autowired
    private VisitLaunDao visitLaunDao;

    public void setVisitLaunDao(VisitLaunDao visitLaunDao) {
        this.visitLaunDao = visitLaunDao;
    }

    // для шаблонов рассылки - вывод формы создания
    @RequestMapping(value = "/create_laun.html", method = RequestMethod.GET)
    public String createLaun(FormFieldsDto dto, HttpServletRequest req,
                             @RequestParam(value = "id", required = false) Integer idTemplate, Map model) {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        HttpSession session = req.getSession();
        if (idTemplate != null) { //при выборе шаблона из списка
            dto.setIdTemplate(idTemplate);
            model.put("formField", dto);
            return "launsoon_edit";
        } else {  //при неявном возврате на страницу редактирования
            FormFieldsDto tempLaunSiteDto = (FormFieldsDto) session.getAttribute("tempLaunSiteDto");
            if (tempLaunSiteDto != null) {
                model.put("formField", tempLaunSiteDto);
                return "launsoon_edit";
            } else {
                return "error";
            }
        }
    }


    // для шаблонов ожидания - вывод формы редактирования
    @RequestMapping(value = "/edit_laun_site.html", method = RequestMethod.GET)
    public String editLaunchSoon(FormFieldsDto dto, HttpServletRequest req, @RequestParam(value = "id", required = false) Integer id, Map model) {
        HttpSession session = req.getSession();
        session.setAttribute("formZip", null); //обнуляем параметры шаблона на случай выбора нового
        session.setAttribute("confZip", null);
        Integer idN = 0;
        if (id != null) {
            idN = id;
        } else if (session.getAttribute("idTemplate") != null) {
            dto.setError("");
            idN = (Integer) session.getAttribute("idTemplate");
        }
        if (idN != null) {
            model.put("id", idN);
            if (dto == null) {
                dto = new FormFieldsDto();
            }
            model.put("formField", dto);
            session.setAttribute("idTemplate", idN);
            return "launsoon_edit";
        }
        return "error";
    }

    // для шаблонов рассылки - считывание данных с формы редактирования и обработка     //todo: сделать под лаунчи
    @RequestMapping(value = "/edit_laun_site.html", method = RequestMethod.POST)
    public String editLead(@Valid FormFieldsDto dto, HttpServletRequest req, Map model) throws IOException {
        HttpSession session = req.getSession();
//        String err = validateCreateLeadSite(dto);
//        if (err != null) {                            //валидация
//            model.put("cause", err);
//            return "error";
//        }
//        dto = cleanForm(dto);
        req.getSession().setAttribute("formZip", dto);
        req.getSession().setAttribute("tempLaunSiteDto", dto);
//        LaunSite launSite = convertDtoToLaunSite(dto);
//        if (leadSite.getId() != null) {    //если сайту присвоен айди в БД - обновляем
////            syncLeadDtoWithDB(dto);
//        } else
        {
            session.setAttribute("tempLaunSiteDto", dto);
        }
        model.put("formField", dto);
        return "templ_laun";
    }


    //ХОСТИНГ ЛАУНЧЕЙ
    @RequestMapping(value = "/laun-host.html", method = RequestMethod.GET)
    public String launHost(HttpServletRequest req, @RequestParam(value = "id",
            required = true) Integer id, Map model) throws IOException {
        LaunSite launSite = launSiteDao.findLaunSiteById(id);
        FormFieldsDto formFieldsDto = convertLaunSiteToDto(launSite);
        model.put("formField", formFieldsDto);
        addVisit(id, req);
        model.put("notshow", true);
        return "templ_laun";
    }

    //проверка открывали ли мы сайт в этот запуск браузера, чтобы не ставить лишних визитов
    //простановка визитов в базу
    private void addVisit(Integer siteId, HttpServletRequest req) {
        Collection<Integer> visitedSites = (TreeSet<Integer>) req.getSession().getAttribute("visitedLaunSites");
        if (visitedSites == null) {
            visitedSites = new TreeSet<Integer>();
        }
        if (!visitedSites.contains(siteId)) {
            visitLaunDao.addVisit(siteId);
            visitedSites.add(siteId);
            // если сайт не посещался:добавляем в лист и пишем в сессию
            req.getSession().setAttribute("visitedLaunSites", visitedSites);
        }
    }

    //сохранение только созданных сайтов в БД и переход в кабинет
    @RequestMapping(value = "/save_laun_site.html", method = RequestMethod.GET)
    public String save_site(HttpServletRequest req, SetPeriodDto dto, Map model) throws IOException {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        User user = (User) req.getSession().getAttribute("user");
        model.put("setPeriod", dto);
        FormFieldsDto launSiteDto = (FormFieldsDto) req.getSession().getAttribute("tempLaunSiteDto");
        //задаем владельца
        req.getSession().setAttribute("tempLaunSiteDto", null);
        if (launSiteDto != null) {
            launSiteDto.setOwnerId(user.getId());
            LaunSite launSite = convertDtoToLaunSite(launSiteDto);
            launSiteDao.addLaunSite(launSite);
        }
        return "redirect:userhome_launs.html";
    }

    @RequestMapping(value = "/delete_laun_site.html", method = RequestMethod.GET)
    public String userhome_stat(HttpServletRequest req, @RequestParam(value = "id",
            required = true) Integer id, SetPeriodDto dto, Map model) throws IOException {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        model.put("setPeriod", dto);
        User user = (User) req.getSession().getAttribute("user");
        launSiteDao.deleteLaunSiteById(id);
        return "redirect:userhome_launs.html";
    }

    private boolean isActiveUser(HttpServletRequest request) {
        boolean answer = false;
        HttpSession session = request.getSession();
        if (session.getAttribute("user") != null) {
            User user = (User) session.getAttribute("user");
            if (!user.getStatus().equals(User.INACTIVE)) {
                answer = true;
            }
        }
        return answer;
    }

    private LaunSite convertDtoToLaunSite(FormFieldsDto dto) {   //проверить
        LaunSite site = new LaunSite();
        if (dto.getIdSite() != null) {
            site.setId(dto.getIdSite());
        }
        site.setIdTemplate(dto.getIdTemplate());
        site.setOwnerId(dto.getOwnerId());
        site.setTitleTag(dto.getTitleTag());
        site.setKeywordTag(dto.getKeywordTag());
        site.setDescripTag(dto.getDescripTag());
        site.setMainHeader(dto.getMainHeader());
        site.setBriefDef(dto.getBriefDef());
        site.setCompanyName(dto.getCompanyName());
        site.setMySite(dto.getMySite());
        site.setDopText(dto.getDopText());
        site.setMarketType(dto.getMarketType());
        site.setBgImg(dto.getBgImg());
        site.setBtnTxt(dto.getBtnTxt());
        return site;
    }

    private FormFieldsDto convertLaunSiteToDto(LaunSite site) {              //проверить
        FormFieldsDto dto = new FormFieldsDto();
        dto.setIdSite(site.getId());
        dto.setOwnerId(site.getOwnerId());
        dto.setIdTemplate(site.getIdTemplate());
        dto.setTitleTag(site.getTitleTag());
        dto.setKeywordTag(site.getKeywordTag());
        dto.setDescripTag(site.getDescripTag());
        dto.setMainHeader(site.getMainHeader());
        dto.setBriefDef(site.getBriefDef());
        dto.setCompanyName(site.getCompanyName());
        dto.setMySite(site.getMySite());
        dto.setDopText(site.getDopText());
        dto.setMarketType(site.getMarketType());
        dto.setBgImg(site.getBgImg());
        dto.setBtnTxt(site.getBtnTxt());
        return dto;
    }

}
